package 链表;

import Utils.ListNode;

/**
 * @author: TTDB
 * @create: 2025/9/16
 */
public class reverseKGroup {
    public ListNode reverseKGroup(ListNode head, int k) {
        // 统计节点个数
        int n = 0;
        for (ListNode cur = head; cur != null; cur = cur.next) {
            n++;
        }

        ListNode dummy = new ListNode(0, head);
        ListNode p0 = dummy;
        ListNode pre = null;
        ListNode cur = head;

        // k 个一组处理
        for (; n >= k; n -= k) {
            for (int i = 0; i < k; i++) { // 同 92 题
                ListNode nxt = cur.next;
                cur.next = pre; // 每次循环只修改一个 next，方便大家理解
                pre = cur;
                cur = nxt;
            }

//            p0.next.next = cur; - 将当前段的最后一个节点连接到下一段的第一个节点
//            p0.next = pre; - 将前一段的最后一个节点连接到当前段翻转后的第一个节点
//            p0 = nxt; - 更新p0指针，指向下一段的前一个节点
            ListNode nxt = p0.next;// 保存当前段翻转前的第一个节点（翻转后会成为该段最后一个节点）
            p0.next.next = cur;// 将当前段的最后一个节点连接到下一段的第一个，cur现在是翻转后的第一个节点
            p0.next = pre;// pre是这一段的第一个节点，dummy链接第一个，将前一段的最后一个节点连接到当前段翻转后的第一个节点
            p0 = nxt;// 更新p0指针，指向下一段的前一个节点
        }
        return dummy.next;
    }
}
